在前幾天的文章裡,透過瀏覽器可以直接看到Consul的內容等等,安全上有很大的問題,今天要來啟動ACL來限制管理相關資訊的存取。
Consul 使用ACL來管理保護Web UI, HTTP API, CLI, service communications 與Consul agent .communications. ACL組成最小單位是rule, rule再集合成ACL policy, 在create token時,可以賦予該token要擁有那些policy.
從下圖來看會比較清楚明瞭。
圖片來源: https://learn.hashicorp.com/tutorials/consul/access-control-setup?in=consul/day-0
<resource> "<name>" {
policy = "<policy disposition>"
}
resource: 在Consul有很多種,如: 提供K/V的 key,key_prefix; 提供service的 service, service_prefix等等。
name: resource name, 如果你的resource是service, 這邊就是service name。
policy: Policy 裡有幾個control level, 分別是 read, write, list deny, 需要多個使用逗號分開”,” ,
優先順序是 deny > write > read >list
以service為範例說明:
service_prefix "web" {
policy = "list"
}
service "web-api" {
policy = "list,read"
}
假設我們有數個service名稱為web, web-front, web-back, web-api.
第一個rule使用prefix前綴表示 service name開頭為web的都有權限可以list.
第二個rule使用完全匹配規則,service name要完全符合”web-api”才有權限可以list,read.
# acl.hcl
acl = {
enabled = true
default_policy = "deny"
enable_token_persistence = true
}
enable: 啟用ACL
default_policy: 設定default值為全部拒絕。
enable_token_persistence: 將token的資料持久化於disk上。
登入需要輸入token, 那我們來創建一個。
如同大多數的系統,初始化後一定會有一個最高的帳號權限,Consul也是相同,現在我們來初始化取得最高權限的token.
$ consul acl bootstrap
AccessorID: b7938c8c-e397-fd02-b8d9-9c4c49e9f87f
SecretID: 72ee0d8a-39bd-d412-854a-84c7b66a5d3f
Description: Bootstrap Token (Global Management)
Local: false
Create Time: 2020-09-05 01:57:04.794102805 +0000 UTC
Policies:
00000000-0000-0000-0000-000000000001 - global-management
AccessorID: 這一組token的一個編號,之後如果忘記了token可以透過AccessorID來找回。
SecretID: 即產生的token.
Create Time: 可以看到這裡只有Create Time, 沒有Expiration Time, 所以不會過期。
Policies: 可以看到Policies的內容為global-management, 是不受任何ACL限制的,使用管理上須注意。
現在可以透過這組SecretID來登入Web UI了。
剛剛創建的bootstrap token除了可以查看整體相關資源,也可以看到在Key, ACL等功能裡可以create, 權限太高了,而且以上的教學都沒有包含設定Policy, 接下來會完整的說明從設定Policy到創建Token.
以建立Consul UI token為例:
# consul-ui.hcl
service_prefix "" {
policy = "read"
}
key_prefix "" {
policy = "read"
}
node_prefix "" {
policy = "read"
}
$ consul acl policy create -name "consul-ui" -description="Consul UI read only" -rules @consul-ui.hcl
ID: 7649b60e-af85-5365-7513-c6cae981a828
Name: consul-ui
Description: Consul UI read only
Datacenters:
Rules:
service_prefix "" {
policy = "read"
}
key_prefix "" {
policy = "read"
}
node_prefix "" {
policy = "read"
}
-name: 給定policy名稱
-description: 加入描述說明
-rules: import policy rules.
ID: 為policy ID, 之後要創建token可以使用policy ID 或是 policy name.
Datacenters: 目前只有一座Consul server, 所以沒有指定datacenter.
$ consul acl token create -description "Token for Consul UI" -policy-name consul-ui -expires-ttl 3h
AccessorID: 80684e6d-022e-848b-218e-6c111e8d5907
SecretID: 25619c34-f703-390d-08b0-f3a55a7682df
Description: Token for Consul UI
Local: false
Create Time: 2020-09-05 02:38:24.745334397 +0000 UTC
Expiration Time: 2020-09-05 05:38:24.745334397 +0000 UTC
Policies:
7649b60e-af85-5365-7513-c6cae981a828 - consul-ui
-name: 給定要賦予policy的名稱可以多個。
-description: 加入描述說明。
-expires-ttl: 設定TTL,若沒有則不會有Expiration Time.
Expiration Time: token 到期的時間。
Policies: 這組token擁有的policy name為"consul-ui", policy id 為"7649b60e-af85-5365-7513-c6cae981a828", 可以對照我們剛剛匯入後,產生的policy id是相同的。